import os  # 用于访问环境变量和操作系统功能

from fastapi import FastAPI  # 用于创建API服务的FastAPI框架
from langchain_core.output_parsers import StrOutputParser  # 用于解析模型输出为字符串
from langchain_core.prompts import ChatPromptTemplate  # 用于构建对话提示模板
from langchain_openai import ChatOpenAI  # 用于调用OpenAI兼容接口的模型（适配阿里云百炼）
from langserve import add_routes  # 用于将LangChain链路添加到FastAPI服务
from pydantic import SecretStr  # 用于安全存储和传递API密钥（避免明文暴露）


# 从环境变量获取阿里云百炼API密钥
# 注意：环境变量名需与实际设置一致（此处为DEEPSEEK_API_KEY）
api_key = os.getenv("DEEPSEEK_API_KEY")
# 检查API密钥是否存在，若不存在则抛出错误提示
if not api_key:
    raise ValueError("请设置环境变量DASHSCOPE_API_KEY（阿里云百炼API-KEY）")

# 1. 创建大语言模型实例（适配阿里云百炼的DeepSeek模型）
model = ChatOpenAI(
    model="deepseek-r1",  # 模型名称，需与阿里云百炼平台支持的模型名一致
    temperature=0,  # 生成内容的随机性（0表示确定性输出，1表示最大随机性）
    max_tokens=None,  # 最大生成 tokens 数（None表示使用模型默认值）
    timeout=None,  # 超时时间（None表示无超时限制）
    max_retries=2,  # 调用失败时的最大重试次数
    api_key=SecretStr(api_key),  # 以安全字符串形式传递API密钥
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 阿里云百炼的OpenAI兼容接口地址
)

# 2. 创建提示模板（定义对话角色和用户输入格式）
prompt_template = ChatPromptTemplate.from_messages([
    ("system", "你是一个资深Python开发工程师"),  # 系统提示：定义模型的角色和行为
    ("human", "{user_input}")  # 用户输入：使用占位符{user_input}接收动态输入
])

# 3. 构建完整的处理链路（提示模板→模型→输出解析器）
parser = StrOutputParser()  # 初始化字符串输出解析器
chain = prompt_template | model | parser  # 管道操作：按顺序执行提示模板→模型调用→结果解析

# 4. 测试链路调用（验证模型是否正常工作）
# 调用链路并传入用户问题，打印返回结果
print(chain.invoke({"user_input": "python和java哪个好，50字以内简明概要"}))

# 5. 部署为API服务（使用FastAPI）
# 创建FastAPI应用实例，定义服务标题、版本和描述
app = FastAPI(
    title='LangChain Demo',  # 服务标题
    version='V1.0',  # 服务版本
    description="python大师"  # 服务描述（可根据实际功能修改）
)

# 将LangChain链路添加到FastAPI服务，定义访问路径
add_routes(
    app,
    chain,  # 要部署的链路
    path="/chain",  # API访问路径（通过http://host:port/chain调用）
)

# 6. 启动服务（当脚本直接运行时）
if __name__ == '__main__':
    import uvicorn  # 用于运行FastAPI服务的服务器

    # 启动服务：监听所有网络接口（0.0.0.0），端口8000
    uvicorn.run(app, host='0.0.0.0', port=8000)